package com.jdbc.transactionnew;

import com.jdbc.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * JDBC Part5 数据库事务new
 * Description: Service 层使用 JDBCUtils 封装的获取、回收连接方法
 * TODO:
 *  1. 业务层无需传递connection参数，直接调用工具类获取connection，实现数据库连接的生成与断开
 */
public class BankService {

    /**
     * 转账业务方法
     * 金额字段数据类型设置为非负数，转账业务单一执行会报错，需要在事务中执行
     *
     * @param addAccount  加钱账号
     * @param subAccount  减钱账号
     * @param money  金额
     */
    public void transfer(String addAccount, String subAccount, int money) throws ClassNotFoundException, SQLException {

        System.out.println("addAccount = " + addAccount + ", subAccount = " + subAccount + ", money = " + money);

        //TODO：通过工具类获取连接
        Connection connection = JdbcUtils.getConnection();

        // 转账成功标记
        int flag = 0;

        //利用try代码块,开启事务，调用dao
        try {
            //开启事务(关闭事务自动提交)
            connection.setAutoCommit(false);

            //调用加钱 和 减钱
            BankDao bankDao = new BankDao();
            // TODO:无需再向DAO层传递连接，只需调用方法执行业务操作
            bankDao.addMoney(addAccount, money);
            System.out.println("--------------");
            bankDao.subMoney(subAccount, money);
            flag = 1;

            //不报错,提交事务
            connection.commit();
        } catch (Exception e) {
            //报错回滚事务
            connection.rollback();
            throw e;
        } finally {
            // TODO：通过JDBC工具类统一进行连接关闭
            JdbcUtils.freeConnection();
        }

        if (flag == 1){
            System.out.println("转账成功!");
        }else{
            System.out.println("转账失败!");
        }
    }

}
